#include <rthw.h>
#include <rtthread.h>
#include "board.h"
/***********************这里写一些关于控制的函数  风机 �?  烧毁电阻  加热PID***********************/

/**
  * @brief  配置控制相关的GPIO管脚(针�?�开关量)  给自己一点保护色
  * @param  �? 
  * @retval �?
  */
static void ControlRelativeGPIO_Config(void)
{
  DESTROY_GPIO_CLK_CMD_FUN(DESTROY_GPIO_CLK_CMD);
  gpio_mode_set(DESTROY_GPIO_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, DESTROY_GPIO_PIN);
  gpio_output_options_set(DESTROY_GPIO_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_MAX, DESTROY_GPIO_PIN);

  HEAT_GPIO_CLK_CMD_FUN(HEAT_GPIO_CLK_CMD);
  gpio_mode_set(HEAT_GPIO_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, HEAT_GPIO_PIN);
  gpio_output_options_set(HEAT_GPIO_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_MAX, HEAT_GPIO_PIN);

  PUMP_GPIO_CLK_CMD_FUN(PUMP_GPIO_CLK_CMD);
  gpio_mode_set(PUMP_GPIO_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, PUMP_GPIO_PIN);
  gpio_output_options_set(PUMP_GPIO_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_MAX, PUMP_GPIO_PIN);

  gpio_bit_reset(DESTROY_GPIO_PORT, DESTROY_GPIO_PIN);
  gpio_bit_reset(HEAT_GPIO_PORT, HEAT_GPIO_PIN);
  gpio_bit_reset(PUMP_GPIO_PORT, PUMP_GPIO_PIN);
}

/**
  * @brief  相关控制初�?�化
  * @param  �? 
  * @retval �?
  */
void ControlInit(void)
{
  ControlRelativeGPIO_Config(); //
  TIM1_Fan_Configuration();     //风机PWM定时器初始化
  TIM16_Buzzer_Configuration();
  TIM2_PWM_Configuration(); //这个是PID�?口的控制用定时器
  PID_Init();
}

/**
  * @brief 泵开�?                
  * @param  En:�?否开�?�?
  *         ENABLE:开�?
  *         DISABLE:关闭
  * @retval �?
  */
void PumpControl(ControlStatus En)
{
  if (En == ENABLE)
  {
    gpio_bit_set(PUMP_GPIO_PORT, PUMP_GPIO_PIN);
  }
  else
  {
    gpio_bit_reset(PUMP_GPIO_PORT, PUMP_GPIO_PIN);
  }
}

/**
  * @brief  电蚊香加�?开�?                
  * @param  En:�?否开�?加热
  *         ENABLE:开�?
  *         DISABLE:关闭
  * @retval �?
  */
void HeatControl(ControlStatus En)
{
  if (En == ENABLE)
  {
    gpio_bit_set(HEAT_GPIO_PORT, HEAT_GPIO_PIN);
  }
  else
  {
    gpio_bit_reset(HEAT_GPIO_PORT, HEAT_GPIO_PIN);
  }
}

/**
  * @brief  烧毁电阻开�?                
  * @param  En:�?否开关�?�机
  *         ENABLE:开�?
  *         DISABLE:关闭
  * @retval �?
  */
void DestroyControl(ControlStatus En)
{
  if (En == ENABLE)
  {
    gpio_bit_set(DESTROY_GPIO_PORT, DESTROY_GPIO_PIN);
  }
  else
  {
    gpio_bit_reset(DESTROY_GPIO_PORT, DESTROY_GPIO_PIN);
  }
}

/**
  * @brief  加热PID控制(根据�?标温度�?,以及当下的NTC电阻温度值控制定时器的脉�?) 定时调用            
  * @param  En:�?否开启PID加热
  *         ENABLE:开�?
  *         DISABLE:关闭
  * @retval �?
  */
void HeatPIDControl(ControlStatus En)
{
  //先把PID搞定�?
  if (En == ENABLE)
  {
    PID_Run_Flag = 1; //PWM定时器在�?,并且PID在进行�?�算
  }
  else
  {
    PID_Run_Flag = 0; //PWM定时器还在走,不过PWM占空比变�?0�?
  }
}

volatile uint8_t PumpRunFlag = 0;

/**
  * @brief  设定泵电机转动的圈数         
  * @param  LoopCnt:要求电机�?动的圈数
  * @retval �?
  */
void SetPumpLoop(uint32_t LoopCnt)
{
  if (PumpRunFlag == 0)
  { //电机处于运�?�状态时,就不在进行�?�定电机�?动圈数的操作
    PumpBottleTargetCnt = LoopCnt + ConfigParam.PumpCnt.pumpcnt;  //后一�?参数�?先前已经泵的次数(�?写进了EEPROM�?)
    PumpRunFlag = 1; //该标志位会在电机�?完指定的圈数后清�?
    PumpControl(ENABLE);
  }
}

uint8_t notify_flag=0;   //提示�?瓶没有安装好标志
uint8_t need_evacuation=0;  //新瓶子需要排空气标志

/**                                      
  * @brief  当前�?瓶药�?,及药物�?�类判断    这里得考虑喂看门狗的问�?     
  * @param  �?   这个函数得在开熏蒸加热之前调用
  * @retval �?
  */
static void MedicineBottleResistor(void)
{
  uint32_t dat_buff[6];
  uint8_t is_new1=0;
 // uint8_t is_new2=0;

  rt_base_t level;
 
  level = rt_hw_interrupt_disable();

  dat_buff[0]=RegularConvData_Tab[0];
  dat_buff[0]=dat_buff[0]*3300UL/4096UL;
  if(2500<dat_buff[0])
  { //新瓶�?
    is_new1=1;
  }
  else
  {
    is_new1=0;
  }
  goto mark;

//  delay_ms(50);       //等待50ms
//  dat_buff[1]=RegularConvData_Tab[0];
//  dat_buff[1]=dat_buff[1]*3300UL/4096UL;
//  if(2500<dat_buff[1])
//  { //新瓶�?
//    is_new1=1;
//  }
//  else
//  {
//    is_new1=0;
//  }
mark:

  if(is_new1==1)
  { //当为新瓶子时,开始烧电阻
    DestroyControl(ENABLE);
      IWDG_Feed();  //ι��
    delay_ms(300);       //300ms用来烧保险�??
        IWDG_Feed();  //ι��
    DestroyControl(DISABLE);
    delay_ms(200);       //等待200ms
      IWDG_Feed();  //ι��
  }
  /***********************************************************************************************/
  dat_buff[0]=RegularConvData_Tab[0];
  dat_buff[0]=dat_buff[0]*3300UL/4096UL;
  if(500<dat_buff[0] && dat_buff[0]<1500)
  { //�?通药�?
    if(is_new1==1)
    { //安�?�了新瓶�?
      is_new1=0;
      ConfigParam.PumpCnt.is_empty=NOT_EMPTY;
      ConfigParam.PumpCnt.pumpcnt=0; 
      ConfigParam.PumpCnt.type=NORMAL_MEDICINE;
      need_evacuation=1;  //新瓶子需要排空气标志
      //这里得立即将上面这个参数存起�?(EEPROM�?)
      IWDG_Feed();  //ι��
      ee_WriteBytes((uint8_t *)&ConfigParam.PumpCnt.pumpcnt,ConfigParam.PumpCnt.pumpcnt_addr,PUMPCNT_LENGTH);
    }
      notify_flag=0; //电压正常,不提�?
    goto des;
  }
  else if(1500<dat_buff[0] && dat_buff[0]<2500)
  { //高效�?�?
    if(is_new1==1)
    {
      is_new1=0;
      ConfigParam.PumpCnt.is_empty=NOT_EMPTY;
      ConfigParam.PumpCnt.pumpcnt=0; 
      ConfigParam.PumpCnt.type=ENCHANCE_MEDICINE;
      need_evacuation=1;  //新瓶子需要排空气标志
      //这里得立即将上面这个参数存起�?(EEPROM�?)
      IWDG_Feed();  //ι��
      ee_WriteBytes((uint8_t *)&ConfigParam.PumpCnt.pumpcnt,ConfigParam.PumpCnt.pumpcnt_addr,PUMPCNT_LENGTH);
    }
      notify_flag=0;
    goto des;
  }
/***********************************************************************************************/
/***********************************************************************************************/
      IWDG_Feed();  //ι��
  delay_ms(50);       //等待50ms
  dat_buff[1]=RegularConvData_Tab[0];
  dat_buff[1]=dat_buff[1]*3300UL/4096UL;
  if(500<dat_buff[1] && dat_buff[1]<1500)
  { //�?通药�?
    if(is_new1==1)
    {
      is_new1=0;
      ConfigParam.PumpCnt.is_empty=NOT_EMPTY;
      ConfigParam.PumpCnt.pumpcnt=0; 
      ConfigParam.PumpCnt.type=NORMAL_MEDICINE;
      need_evacuation=1;  //新瓶子需要排空气标志
      //这里得立即将上面这个参数存起�?(EEPROM�?)
      IWDG_Feed();  //ι��
      ee_WriteBytes((uint8_t *)&ConfigParam.PumpCnt.pumpcnt,ConfigParam.PumpCnt.pumpcnt_addr,PUMPCNT_LENGTH);
    }
      notify_flag=0;
    goto des;
  }
  else if(1500<dat_buff[1] && dat_buff[1]<2500)
  { //高效�?�?
    if(is_new1==1)
    {
      is_new1=0;
      ConfigParam.PumpCnt.is_empty=NOT_EMPTY;
      ConfigParam.PumpCnt.pumpcnt=0; 
      ConfigParam.PumpCnt.type=ENCHANCE_MEDICINE;
      need_evacuation=1;  //新瓶子需要排空气标志
      //这里得立即将上面这个参数存起�?(EEPROM�?)
      IWDG_Feed();  //ι��
      ee_WriteBytes((uint8_t *)&ConfigParam.PumpCnt.pumpcnt,ConfigParam.PumpCnt.pumpcnt_addr,PUMPCNT_LENGTH);
    }
      notify_flag=0;
    goto des;
  }
/***********************************************************************************************/
/***********************************************************************************************/
      IWDG_Feed();  //ι��
  delay_ms(50);       //等待50ms
  dat_buff[2]=RegularConvData_Tab[0];
  dat_buff[2]=dat_buff[2]*3300UL/4096UL;
  if(500<dat_buff[2] && dat_buff[2]<1500)
  { //�?通药�?
    if(is_new1==1)
    {
      is_new1=0;
      ConfigParam.PumpCnt.is_empty=NOT_EMPTY;
      ConfigParam.PumpCnt.pumpcnt=0; 
      ConfigParam.PumpCnt.type=NORMAL_MEDICINE;
      need_evacuation=1;  //新瓶子需要排空气标志
      //这里得立即将上面这个参数存起�?(EEPROM�?)
        IWDG_Feed();  //ι��
      ee_WriteBytes((uint8_t *)&ConfigParam.PumpCnt.pumpcnt,ConfigParam.PumpCnt.pumpcnt_addr,PUMPCNT_LENGTH);
    }
      notify_flag=0;
    goto des;
  }
  else if(1500<dat_buff[2] && dat_buff[2]<2500)
  { //高效�?�?
    if(is_new1==1)
    {
      is_new1=0;
      ConfigParam.PumpCnt.is_empty=NOT_EMPTY;
      ConfigParam.PumpCnt.pumpcnt=0; 
      ConfigParam.PumpCnt.type=ENCHANCE_MEDICINE;
      need_evacuation=1;  //新瓶子需要排空气标志
      //这里得立即将上面这个参数存起�?(EEPROM�?)
        IWDG_Feed();  //ι��
      ee_WriteBytes((uint8_t *)&ConfigParam.PumpCnt.pumpcnt,ConfigParam.PumpCnt.pumpcnt_addr,PUMPCNT_LENGTH);
    }
      notify_flag=0;
    goto des;
  }
/***********************************************************************************************/
/***********************************************************************************************/
      IWDG_Feed();  //ι��
  delay_ms(50);       //等待50ms
  dat_buff[3]=RegularConvData_Tab[0];
  dat_buff[3]=dat_buff[3]*3300UL/4096UL;
  if(500<dat_buff[3] && dat_buff[3]<1500)
  { //�?通药�?
    if(is_new1==1)
    {
      is_new1=0;
      ConfigParam.PumpCnt.is_empty=NOT_EMPTY;
      ConfigParam.PumpCnt.pumpcnt=0; 
      ConfigParam.PumpCnt.type=NORMAL_MEDICINE;
      need_evacuation=1;  //新瓶子需要排空气标志
      //这里得立即将上面这个参数存起�?(EEPROM�?)
      IWDG_Feed();  //ι��
      ee_WriteBytes((uint8_t *)&ConfigParam.PumpCnt.pumpcnt,ConfigParam.PumpCnt.pumpcnt_addr,PUMPCNT_LENGTH);
    }
      notify_flag=0;
    goto des;
  }
  else if(1500<dat_buff[3] && dat_buff[3]<2500)
  { //高效�?�?
    if(is_new1==1)
    {
      is_new1=0;
      ConfigParam.PumpCnt.is_empty=NOT_EMPTY;
      ConfigParam.PumpCnt.pumpcnt=0; 
      ConfigParam.PumpCnt.type=ENCHANCE_MEDICINE;
      need_evacuation=1;  //新瓶子需要排空气标志
      //这里得立即将上面这个参数存起�?(EEPROM�?)
        IWDG_Feed();  //ι��
      ee_WriteBytes((uint8_t *)&ConfigParam.PumpCnt.pumpcnt,ConfigParam.PumpCnt.pumpcnt_addr,PUMPCNT_LENGTH);
    }
      notify_flag=0;
    goto des;
  }
/***********************************************************************************************/
/***********************************************************************************************/
      IWDG_Feed();  //ι��
  delay_ms(50);       //等待50ms
  dat_buff[4]=RegularConvData_Tab[0];
  dat_buff[4]=dat_buff[4]*3300UL/4096UL;
  if(500<dat_buff[4] && dat_buff[4]<1500)
  { //�?通药�?
    if(is_new1==1)
    {
      is_new1=0;
      ConfigParam.PumpCnt.is_empty=NOT_EMPTY;
      ConfigParam.PumpCnt.pumpcnt=0; 
      ConfigParam.PumpCnt.type=NORMAL_MEDICINE;
      need_evacuation=1;  //新瓶子需要排空气标志
      //这里得立即将上面这个参数存起�?(EEPROM�?)
      IWDG_Feed();  //ι��
      ee_WriteBytes((uint8_t *)&ConfigParam.PumpCnt.pumpcnt,ConfigParam.PumpCnt.pumpcnt_addr,PUMPCNT_LENGTH);
    }
      notify_flag=0;
    goto des;
  }
  else if(1500<dat_buff[4] && dat_buff[4]<2500)
  { //高效�?�?
    if(is_new1==1)
    {
      is_new1=0;
      ConfigParam.PumpCnt.is_empty=NOT_EMPTY;
      ConfigParam.PumpCnt.pumpcnt=0; 
      ConfigParam.PumpCnt.type=ENCHANCE_MEDICINE;
      need_evacuation=1;  //新瓶子需要排空气标志
      //这里得立即将上面这个参数存起�?(EEPROM�?)
      IWDG_Feed();  //ι��
      ee_WriteBytes((uint8_t *)&ConfigParam.PumpCnt.pumpcnt,ConfigParam.PumpCnt.pumpcnt_addr,PUMPCNT_LENGTH);
    }
      notify_flag=0;
    goto des;
  }
/***********************************************************************************************/
/***********************************************************************************************/
      IWDG_Feed();  //ι��
  delay_ms(50);       //等待50ms
  dat_buff[5]=RegularConvData_Tab[0];
  dat_buff[5]=dat_buff[5]*3300UL/4096UL;
  if(500<dat_buff[5] && dat_buff[5]<1500)
  { //�?通药�?
    if(is_new1==1)
    {
      is_new1=0;
      ConfigParam.PumpCnt.is_empty=NOT_EMPTY;
      ConfigParam.PumpCnt.pumpcnt=0; 
      ConfigParam.PumpCnt.type=NORMAL_MEDICINE;
      need_evacuation=1;  //新瓶子需要排空气标志
      //这里得立即将上面这个参数存起�?(EEPROM�?)
      IWDG_Feed();  //ι��
      ee_WriteBytes((uint8_t *)&ConfigParam.PumpCnt.pumpcnt,ConfigParam.PumpCnt.pumpcnt_addr,PUMPCNT_LENGTH);
    }
      notify_flag=0;
    goto des;
  }
  else if(1500<dat_buff[5] && dat_buff[5]<2500)
  { //高效�?�?
    if(is_new1==1)
    {
      is_new1=0;
      ConfigParam.PumpCnt.is_empty=NOT_EMPTY;
      ConfigParam.PumpCnt.pumpcnt=0; 
      ConfigParam.PumpCnt.type=ENCHANCE_MEDICINE;
      need_evacuation=1;  //新瓶子需要排空气标志
      //这里得立即将上面这个参数存起�?(EEPROM�?)
      IWDG_Feed();  //ι��
      ee_WriteBytes((uint8_t *)&ConfigParam.PumpCnt.pumpcnt,ConfigParam.PumpCnt.pumpcnt_addr,PUMPCNT_LENGTH);
    }
      notify_flag=0;
    goto des;
  }
  /***********************************************************************************************/
//能到这一步�?�明�?瓶没有安�?,或者没安�?�好,或者触点�??�?接了
  notify_flag=1;    //将药瓶没有安装好标志位置1
des:
  rt_hw_interrupt_enable(level);

  //此时泵�?�数值还不能归零,�?有等到�?�测到�?了新�?瓶时,才可将其归零

}

WORKING_STEP_Typedef working_step=STEP_ALL;   //状态�?�录用变�?(小�??)        ConfigParam.WorkingMode.working_mode这个�?大�??
uint16_t second_cnt=0;  //延时�?动没必�?�那么精�?
uint16_t second_cnt_buff=0;


/**                                      
  * @brief  主�?�是针�?�普通熏�?       
  * @param  �?
  * @retval �?
  */
void FumigateNormal(void)
{
  static  uint32_t medicine_quantity=0;

  if (ConfigParam.WorkingMode.working_mode == ENUM_FUMIGATE_NORMAL_MODE)
  { //针�?�灭蚊普�?
    if (ConfigParam.WorkingStatus.working_status == ENUM_WORKING_READY)
    { //这里�?点下�?动键之后的情�?    富贵危险困苦�?求得
      switch (ConfigParam.FumigateSetting.fumi_delay_time.delay_enum)
      {
        case ENUM_CUSTOM_DELAY_TIME:
          if (ConfigParam.FumigateSetting.fumi_delay_time.delay_val == 0)
          { //立即开始工�?
            ConfigParam.WorkingStatus.working_status = ENUM_WORKING_START;
            working_step=STEP2; //
          }
          else
          { //经过适当的延时才开始工�?
            ConfigParam.WorkingStatus.working_status = ENUM_WORKING_WAIT;
            working_step=STEP1;
            second_cnt=ConfigParam.FumigateSetting.fumi_delay_time.delay_val*60;  //这个单位�?�?
          }
          break;
        case ENUM_DELAY_10MIN:
            ConfigParam.WorkingStatus.working_status = ENUM_WORKING_WAIT;
            working_step=STEP1;
            second_cnt=10*60;  //这个单位�?�?
          break;
        case ENUM_DELAY_5MIN:
            ConfigParam.WorkingStatus.working_status = ENUM_WORKING_WAIT;
            working_step=STEP1;
            second_cnt=5*60;  //这个单位�?�?
          break;
        case ENUM_DELAY_2MIN:
            ConfigParam.WorkingStatus.working_status = ENUM_WORKING_WAIT;
            working_step=STEP1;
            second_cnt=2*60;  //这个单位�?�?
          break;
        default:
          break;
      }
      MedicineBottleResistor();    //开始�?�药剂的种类进�?�探�?
      if(need_evacuation==1)
      { //需要排空气
        SetPumpLoop(ConfigParam.FactorySetting.evacuation_times);
      }
    }
    else if (ConfigParam.WorkingStatus.working_status == ENUM_WORKING_WAIT)
    { //这里�?等待状�?
        if(second_cnt>0)
        {
          second_cnt--;
        }
        if(working_step==STEP1)
        {
          if(second_cnt==0)
          { //延时�?动时间到,开始熏�?
            ConfigParam.WorkingStatus.working_status = ENUM_WORKING_START;
            working_step=STEP2; //
          }
        }
        if(working_step==STEP5)
        { 
          if((second_cnt_buff-second_cnt)%180==0)
          { //每3minute秒喷一次
              if(medicine_quantity>=40)
              {
                SetPumpLoop(40);  //50次
                medicine_quantity-=40;
              }
              else if(medicine_quantity>0)
              { //到这里说明 40> medicine_quantity >0
                SetPumpLoop(medicine_quantity);  //有多少喷多少
                medicine_quantity=0;
              }
          } 
          if(second_cnt==0)
          { //熏蒸结束,准�?�停�?
            ConfigParam.WorkingStatus.working_status = ENUM_WORKING_STOP;
            IsChangeMenu=true;  //重绘界面  �?�?一次重�?(故只在这里重�?)
          }
        }
    }
    else if (ConfigParam.WorkingStatus.working_status == ENUM_WORKING_START)
    {   //进入到这一�?,表明延时�?动的时间已经到了       大�?��?�里面分了�?��?�小步�??
        //if(mark1==1)
        if(working_step==STEP2)
        { //这一步可以开风机,加热
          FanControl(2);  //风机全开
          HeatPIDControl(ENABLE);  //开始加�?
          //表示�?以开�?油泵�?
          working_step=STEP3;
        }
        if(working_step==STEP3)
        { //表示�?以开�?油泵�?(前提�?温度到了)
          if((ConfigParam.PID_Param.Self_Tuning_Flag==0)  && ((uint16_t)GetTemperature() >170 ))  //整定完成�?,170度即�?
          { //pid整定完成,并且温度达到了�?�求 

            switch (ConfigParam.FumigateSetting.fumi_sett_area.area_enum_f)
            { //下面根据设置选项，选择对应的药剂量
              case ENUM_CUSTOM_F:
                medicine_quantity=ConfigParam.FumigateSetting.fumi_sett_area.area_val_f*ConfigParam.FactorySetting.house_height.dat_f*ConfigParam.FactorySetting.timers_per1m2/10+0.9F;
                break;
              case ENUM_21_30_M2_F:    //这里就取一�?�?间值吧(25)  
                medicine_quantity=(30UL*ConfigParam.FactorySetting.house_height.dat_f)*(uint32_t)ConfigParam.FactorySetting.timers_per1m2/10+0.9F;
                break;
              case ENUM_10_20_M2_F:   //15
                medicine_quantity=(20UL*ConfigParam.FactorySetting.house_height.dat_f)*(uint32_t)ConfigParam.FactorySetting.timers_per1m2/10+0.9F;
                break;
              case ENUM_BENEATH_10M2_F:  //5ENUM_AUTO_F
                medicine_quantity=(10UL*ConfigParam.FactorySetting.house_height.dat_f)*(uint32_t)ConfigParam.FactorySetting.timers_per1m2/10+0.9F; 
                break;
              case ENUM_AUTO_F:  //5
                medicine_quantity=(10UL*ConfigParam.FactorySetting.house_height.dat_f)*(uint32_t)ConfigParam.FactorySetting.timers_per1m2/10+0.9F; 
                break;
              default:
                break;
            }
            if(medicine_quantity>=40)
            {
              SetPumpLoop(40);  //50次
              medicine_quantity-=40;
            }
            else if(medicine_quantity>0)
            { //到这里说明 40> medicine_quantity >0
              SetPumpLoop(medicine_quantity);  //有多少喷多少
              medicine_quantity=0;
            }

            working_step=STEP4; 
          }
          else
          {
            Buzzer_Sta = 3;
            rt_mb_send(buzzer_mail, (rt_int32_t)(&Buzzer_Sta));
          }
        }
        if(working_step==STEP4)
        { //这里设置一�?定时�?,用来设定什么时候停�?
          second_cnt_buff=second_cnt=ConfigParam.FactorySetting.fumigate_time*60;   //需要工作的时间
          ConfigParam.WorkingStatus.working_status = ENUM_WORKING_WAIT; //进入到监�?
          working_step=STEP5;
        }
    }
    else if (ConfigParam.WorkingStatus.working_status == ENUM_WORKING_STOP)
    {
      second_cnt=0;       //计时时间归零
      working_step=STEP_ALL; //状态�?�位
      FanControl(0);  //关�?�机
      HeatPIDControl(DISABLE); //关闭加热
    }
  }
}

/**                                      
  * @brief  主�?�是针�?��?�强熏蒸       
  * @param  �?
  * @retval �?
  */
void FumigateEnchance(void)
{
  static  uint32_t medicine_quantity=0;

  if (ConfigParam.WorkingMode.working_mode == ENUM_FUMIGATE_ENCHANCE_MODE)
  { //针�?�灭蚊�?�强    当停机状态时才可进�?�工作模式的切换
    if (ConfigParam.WorkingStatus.working_status == ENUM_WORKING_READY)
    { //这里�?点下�?动键之后的情�?    富贵危险困苦�?求得
      switch (ConfigParam.FumigateSetting.fumi_delay_time.delay_enum)
      { //这里�?延时�?动时�?
        case ENUM_CUSTOM_DELAY_TIME:
          if (ConfigParam.FumigateSetting.fumi_delay_time.delay_val == 0)
          { //立即开始工�?
            ConfigParam.WorkingStatus.working_status = ENUM_WORKING_START;
            working_step=STEP2;
          }
          else
          { //经过适当的延时才开始工�?
            ConfigParam.WorkingStatus.working_status = ENUM_WORKING_WAIT;
            working_step=STEP1;
            second_cnt=ConfigParam.FumigateSetting.fumi_delay_time.delay_val*60;  //这个单位�?�?
          }
          break;
        case ENUM_DELAY_10MIN:
            ConfigParam.WorkingStatus.working_status = ENUM_WORKING_WAIT;
            working_step=STEP1;
            second_cnt=10*60;  //这个单位�?�?
          break;
        case ENUM_DELAY_5MIN:
            ConfigParam.WorkingStatus.working_status = ENUM_WORKING_WAIT;
            working_step=STEP1;
            second_cnt=5*60;  //这个单位�?�?
          break;
        case ENUM_DELAY_2MIN:
            ConfigParam.WorkingStatus.working_status = ENUM_WORKING_WAIT;
            working_step=STEP1;
            second_cnt=2*60;  //这个单位�?�?
          break;
        default:
          break;
      }
      MedicineBottleResistor();    //开始�?�药剂的种类进�?�探�?
      if(need_evacuation==1)
      { //需要排空气
        SetPumpLoop(ConfigParam.FactorySetting.evacuation_times);
      }
    }
    else if (ConfigParam.WorkingStatus.working_status == ENUM_WORKING_WAIT)
    { //这里�?等待状�?
        if(second_cnt>0)
        {
          second_cnt--;
        }
        if(working_step==STEP1)
        {
          if(second_cnt==0)
          { //延时�?动时间到,开始熏�?
            ConfigParam.WorkingStatus.working_status = ENUM_WORKING_START;
            working_step=STEP2; //
          }
        }
        if(working_step==STEP5)
        {
          if((second_cnt_buff-second_cnt)%180==0)
          { //每3minute秒喷一次
              if(medicine_quantity>=40)
              {
                SetPumpLoop(40);  //50次
                medicine_quantity-=40;
              }
              else if(medicine_quantity>0)
              { //到这里说明 40> medicine_quantity >0
                SetPumpLoop(medicine_quantity);  //有多少喷多少
                medicine_quantity=0;
              }
          } 
          if(second_cnt==0)
          { //熏蒸结束,准�?�停�?
            ConfigParam.WorkingStatus.working_status = ENUM_WORKING_STOP;
            IsChangeMenu=true;  //重绘界面
          }
        }
    }
    else if (ConfigParam.WorkingStatus.working_status == ENUM_WORKING_START)
    {   //进入到这一�?,表明延时�?动的时间已经到了       大�?��?�里面分了�?��?�小步�??
        //if(mark1==1)
        if(working_step==STEP2)
        { //这一步可以开风机,加热
          FanControl(2);  //风机全开
          HeatPIDControl(ENABLE);  //开始加�?
          //表示�?以开�?油泵�?
          working_step=STEP3;

          Buzzer_Sta = 3;
			    rt_mb_send(buzzer_mail, (rt_int32_t)(&Buzzer_Sta));    //开始熏蒸时蜂鸣器响三下
        
        }
        if(working_step==STEP3)
        { //表示�?以开�?油泵�?
          if((ConfigParam.PID_Param.Self_Tuning_Flag==0)  && ((uint16_t)GetTemperature() >170 ))  //整定完成�?,170度即�?
          { //pid整定完成,并且温度达到了�?�求 

            switch (ConfigParam.FumigateSetting.fumi_sett_area.area_enum_f)
            { //下面根据设置选项，选择对应的药剂量    //这里的房高是一个浮点型变量
              case ENUM_CUSTOM_F:
                medicine_quantity=ConfigParam.FumigateSetting.fumi_sett_area.area_val_f*ConfigParam.FactorySetting.house_height.dat_f*ConfigParam.FactorySetting.timers_per1m2/10+0.9F;
                break;
              case ENUM_21_30_M2_F:    //这里就取一�?�?间值吧(25)  
                medicine_quantity=(30UL*ConfigParam.FactorySetting.house_height.dat_f)*(uint32_t)ConfigParam.FactorySetting.timers_per1m2/10+0.9F;
                break;
              case ENUM_10_20_M2_F:   //15
                medicine_quantity=(20UL*ConfigParam.FactorySetting.house_height.dat_f)*(uint32_t)ConfigParam.FactorySetting.timers_per1m2/10+0.9F;
                break;
              case ENUM_BENEATH_10M2_F:  //5ENUM_AUTO_F
                medicine_quantity=(10UL*ConfigParam.FactorySetting.house_height.dat_f)*(uint32_t)ConfigParam.FactorySetting.timers_per1m2/10+0.9F; 
                break;
              case ENUM_AUTO_F:  //5
                medicine_quantity=(10UL*ConfigParam.FactorySetting.house_height.dat_f)*(uint32_t)ConfigParam.FactorySetting.timers_per1m2/10+0.9F; 
                break;
              default:
                break;
            }
            medicine_quantity=medicine_quantity*12/10;   //增强模式是普通模式的1.2倍
            if(medicine_quantity>=40)
            {
              SetPumpLoop(40);  //50次
              medicine_quantity-=40;
            }
            else if(medicine_quantity>0)
            { //到这里说明 40> medicine_quantity >0
              SetPumpLoop(medicine_quantity);  //有多少喷多少
              medicine_quantity=0;
            }
            working_step=STEP4; 
          }
          else
          {
            Buzzer_Sta = 3;
            rt_mb_send(buzzer_mail, (rt_int32_t)(&Buzzer_Sta));
          }
        }
        if(working_step==STEP4)
        { //这里设置一�?定时�?,用来设定什么时候停�?
          second_cnt_buff=second_cnt=ConfigParam.FactorySetting.fumigate_time*60;   //需要工作的时间(正式的熏蒸时�?)
          ConfigParam.WorkingStatus.working_status = ENUM_WORKING_WAIT; //进入到监�?
          working_step=STEP5;
        }
    }
    else if (ConfigParam.WorkingStatus.working_status == ENUM_WORKING_STOP)
    {
      second_cnt=0;       //计时时间归零
      working_step=STEP_ALL; //状态�?�位
      FanControl(0);  //关�?�机
      HeatPIDControl(DISABLE); //关闭加热
    }
  }
}

uint8_t stop_refresh=0;
uint8_t mark=0;

/**                                      
  * @brief  主�?�是针�?�空调驱蚊模�?      
  * @param  �?
  * @retval �?
  */
void RepelAirCondition(void)
{
  if(ConfigParam.WorkingMode.working_mode == ENUM_REPEL_AIR_CONDI_MODE) //驱蚊
  { //针�?�驱蚊空�?
    // ENUM_MOS_REPEL_NORMAL,
    // ENUM_MOS_REPEL_TIMING,
    if(ConfigParam.RepelSetting.repel_sett_mode==ENUM_MOS_REPEL_NORMAL)
    {   //此时如果点了开�?,就得开始工�?
        if(ConfigParam.WorkingStatus.working_status == ENUM_WORKING_READY)    //一切从简,能用就�??
        { //这里�?点下�?动键之后的情�?    驱蚊时也得延�?,不过这里的延时是得开�?加热�?
          HeatControl(ENABLE);  //开�?蚊�?�加�?(预加�?)
          FanControl(1);  //蚊�?�加�?�?,风机也得开   脱�?�然后�?�向远方
          second_cnt=ConfigParam.FactorySetting.InitRepelTime*60;
          working_step=STEP1;
          ConfigParam.WorkingStatus.working_status = ENUM_WORKING_WAIT;
        }
        else if (ConfigParam.WorkingStatus.working_status == ENUM_WORKING_WAIT)
        { //这里�?等待状�?
            if(second_cnt>0)
            {
              second_cnt--;
            }
            if(working_step==STEP1)
            { //在这里等待加�?完成(这�?�时间里驱蚊�?开�?�?)
              if(second_cnt==0)
              { //前面的加�?时间�?,下面开�?�?�?加热
                ConfigParam.WorkingStatus.working_status = ENUM_WORKING_START;
                working_step=STEP2; //
              }
              if(ConfigParam.RepelSetting.total_repel_time>0)
              { //如果还有驱蚊药剂的话
                ConfigParam.RepelSetting.total_repel_time--;   //每隔1s药剂总时间,得减1
                if(ConfigParam.RepelSetting.total_repel_time%1800==0)
                { //每个30min对药剂时间进行存储
                  ee_WriteBytes((uint8_t *)&ConfigParam.RepelSetting.repel_sett_mode,ConfigParam.RepelSetting.repel_sett_addr,REPELLENT_SETT_LENGTH);
                }
              }
              else
              {  //这里是驱蚊药水用完了的情况
                ConfigParam.WorkingStatus.working_status=ENUM_WORKING_STOP;
                IsChangeMenu=true;  //重绘界面
              }
            }
            if(working_step==STEP3)
            { //在这里等待驱蚊开�?(这�?�时间里驱蚊�?关闭�?)
              if(second_cnt==0)
              { //再�?�开�?驱蚊
                ConfigParam.WorkingStatus.working_status = ENUM_WORKING_START;
                working_step=STEP4; 
              }
            }
        }
        else if (ConfigParam.WorkingStatus.working_status == ENUM_WORKING_START)
        {   //进入到这一�?,表示�?�?加热
            if(working_step==STEP2)
            { //关闭蚊�?�加�?！！
              switch (ConfigParam.RepelSetting.repel_sett_area)
              { //根据当前的面�?来�?�算具体的驱蚊开关时�?(这里表示关闭的时�?)  这里的智能�?�测没有做
              case ENUM_21_30_M2:
                  second_cnt=ConfigParam.FactorySetting.area30m2_factory*ConfigParam.FactorySetting.air_condi_close_time*60UL/100;
                break;
              case ENUM_10_20_M2:
                  second_cnt=ConfigParam.FactorySetting.area20m2_factory*ConfigParam.FactorySetting.air_condi_close_time*60UL/100;
                break;
              case ENUM_BENEATH_10M2:
                  second_cnt=ConfigParam.FactorySetting.area10m2_factory*ConfigParam.FactorySetting.air_condi_close_time*60UL/100;
                break;   //ENUM_AUTO_
              case ENUM_AUTO_:
                  second_cnt=ConfigParam.FactorySetting.area10m2_factory*ConfigParam.FactorySetting.air_condi_close_time*60UL/100;
                break;   //ENUM_AUTO_
              default:
                break;
              }
              HeatControl(DISABLE);
              FanControl(0);  //关�?�机
              ConfigParam.WorkingStatus.working_status = ENUM_WORKING_WAIT;
              working_step=STEP3;
            }
            if(working_step==STEP4)
            { //表示驱蚊开�?的时�?
              switch (ConfigParam.RepelSetting.repel_sett_area)
              { //根据当前的面�?来�?�算具体的驱蚊开关时�?(这里表示关闭的时�?)  这里的智能�?�测没有做
              case ENUM_21_30_M2:
                  second_cnt=ConfigParam.FactorySetting.area30m2_factory*ConfigParam.FactorySetting.air_condi_open_time*60UL/100;
                break;
              case ENUM_10_20_M2:
                  second_cnt=ConfigParam.FactorySetting.area20m2_factory*ConfigParam.FactorySetting.air_condi_open_time*60UL/100;
                break;
              case ENUM_BENEATH_10M2:
                  second_cnt=ConfigParam.FactorySetting.area10m2_factory*ConfigParam.FactorySetting.air_condi_open_time*60UL/100;
                break; 
              case ENUM_AUTO_:
                  second_cnt=ConfigParam.FactorySetting.area10m2_factory*ConfigParam.FactorySetting.air_condi_open_time*60UL/100;
                break;   //ENUM_AUTO_
              default:
                break;
              }
              HeatControl(ENABLE); //开加热
              FanControl(1);  //开风机
              ConfigParam.WorkingStatus.working_status = ENUM_WORKING_WAIT;
              working_step=STEP1;
            }
        }
        else if (ConfigParam.WorkingStatus.working_status == ENUM_WORKING_STOP)
        {
          //IsChangeMenu=true;  //重绘界面   这里不能重绘
          second_cnt=0;       //计时时间�?
          working_step=STEP_ALL; //状态�?�位
          HeatControl(DISABLE);
          FanControl(0);  //关�?�机
        }
    }
    else if(ConfigParam.RepelSetting.repel_sett_mode==ENUM_MOS_REPEL_TIMING)
    {   //这里针对定时驱蚊的情况
      rtc_parameter_struct RTCDateTime;  //这里还得读取当前时间
      uint16_t current_minutes=0;   //当前分钟
      uint16_t start_minutes=0;     //开始分�?
      uint16_t end_minutes=0;       //结束分钟
      static uint8_t mark1=0;

      rtc_current_time_get(&RTCDateTime);  //主�?�是获取当天的日�?
      current_minutes=BCD_To_BIN(RTCDateTime.rtc_hour)*(uint16_t)60+BCD_To_BIN(RTCDateTime.rtc_minute);    //这里向uint16_t转变是为了防止变量值溢出
      start_minutes=ConfigParam.RepelSetting.repel_sett_timing.Start_Hour*(uint16_t)60;
      end_minutes=ConfigParam.RepelSetting.repel_sett_timing.End_Hour*(uint16_t)60;

      if(ConfigParam.RepelSetting.repel_sett_timing.End_Hour>ConfigParam.RepelSetting.repel_sett_timing.Start_Hour)
      {   //结束时间大于开始时间 的情况
        if(start_minutes<= current_minutes  && current_minutes<end_minutes)
        { //注意这里的   <=  和 <号的使用       处于工作时间段内
          if(timing_repel_pause==1)   //       按下了启动键
          { 
            if(ConfigParam.RepelSetting.repel_sett_timing.IsRepeat==true)
            { //点了每天,到点就开�?       //有些参数变化,完成后得妥善保存
              mark=1;
            }
            else if(repel_once_mark==1)
            { //没有点每天
              repel_once_mark=0;
              mark=1;
            }
          }
        }
        else
        { //否则停机
          mark=0;
        }
      }
      else if(ConfigParam.RepelSetting.repel_sett_timing.End_Hour<ConfigParam.RepelSetting.repel_sett_timing.Start_Hour)
      { //结束时间小于开始时间的情况   ,这种情况是指,隔天的情况
        if( !(start_minutes >current_minutes  && current_minutes >=end_minutes) )  
        { //这里是从反方向来考虑的
          if(timing_repel_pause==1)   //       按下了启动键 
          { 
            if(ConfigParam.RepelSetting.repel_sett_timing.IsRepeat==true)
            { //点了每天,到点就开�?
              mark=1;
            }
            else if(repel_once_mark==1)
            { //没有点每�?
              repel_once_mark=0;
              mark=1;
            }
          }
        }
        else
        { //否则停机
          mark=0;
        }
      }
      else
      {
        //否则停机
        mark=0;
      }
      /**
       * 上面�?监控函数
       */
      if(mark==1)
      {
        if(mark1==0)    //一切从简,能用就�??
        { //这里�?点下�?动键之后的情�?    驱蚊时也得延�?,不过这里的延时是得开�?加热�?
          mark1=1;    //为关机做准�??
          ConfigParam.WorkingStatus.working_status = ENUM_WORKING_READY;
          IsChangeMenu=true;     //这里得刷新一下显�?
        }  
        else if(ConfigParam.WorkingStatus.working_status == ENUM_WORKING_READY)
        {
          HeatControl(ENABLE);  //开�?蚊�?�加�?(预加�?)
          FanControl(1);  //蚊�?�加�?�?,风机也得开   脱�?�然后�?�向远方
          second_cnt=ConfigParam.FactorySetting.InitRepelTime*60;
          working_step=STEP1;
          ConfigParam.WorkingStatus.working_status = ENUM_WORKING_WAIT;
        }
        else if (ConfigParam.WorkingStatus.working_status == ENUM_WORKING_WAIT)
        { //这里�?等待状�?
            if(second_cnt>0)
            {
              second_cnt--;
            }
            if(working_step==STEP1)
            { //在这里等待加�?完成(这�?�时间里驱蚊�?开�?�?)
              if(second_cnt==0)
              { //前面的加�?时间�?,下面开�?�?�?加热
                ConfigParam.WorkingStatus.working_status = ENUM_WORKING_START;
                working_step=STEP2; //
              }
              if(ConfigParam.RepelSetting.total_repel_time>0)
              { //如果还有驱蚊药剂的话
                ConfigParam.RepelSetting.total_repel_time--;   //每隔1s药剂总时间,得减1
                if(ConfigParam.RepelSetting.total_repel_time%1800==0)
                { //每个30min对药剂时间进行存储
                  ee_WriteBytes((uint8_t *)&ConfigParam.RepelSetting.repel_sett_mode,ConfigParam.RepelSetting.repel_sett_addr,REPELLENT_SETT_LENGTH);
                }
              }
              else
              { //这里是驱蚊药水已经用完了的情况
                timing_repel_pause=0;  //定时驱蚊暂停   
                mark=0;     //按下停止键时不管三七二十一直接停止
                stop_refresh=1;
              }
            }
            if(working_step==STEP3)
            { //在这里等待驱蚊开�?(这�?�时间里驱蚊�?关闭�?)
              if(second_cnt==0)
              { //再�?�开�?驱蚊
                ConfigParam.WorkingStatus.working_status = ENUM_WORKING_START;
                working_step=STEP4; 
              }
            }
        }
        else if (ConfigParam.WorkingStatus.working_status == ENUM_WORKING_START)
        {   //进入到这一�?,表示�?�?加热
            if(working_step==STEP2)
            { //关闭蚊�?�加�?！！
              switch (ConfigParam.RepelSetting.repel_sett_area)
              { //根据当前的面�?来�?�算具体的驱蚊开关时�?(这里表示关闭的时�?)  这里的智能�?�测没有做
              case ENUM_21_30_M2:
                  second_cnt=ConfigParam.FactorySetting.area30m2_factory*ConfigParam.FactorySetting.air_condi_close_time*60UL/100;
                break;
              case ENUM_10_20_M2:
                  second_cnt=ConfigParam.FactorySetting.area20m2_factory*ConfigParam.FactorySetting.air_condi_close_time*60UL/100;
                break;
              case ENUM_BENEATH_10M2:
                  second_cnt=ConfigParam.FactorySetting.area10m2_factory*ConfigParam.FactorySetting.air_condi_close_time*60UL/100;
                break; 
              case ENUM_AUTO_:
                  second_cnt=ConfigParam.FactorySetting.area10m2_factory*ConfigParam.FactorySetting.air_condi_close_time*60UL/100;
                break;   //ENUM_AUTO_
              default:
                break;
              }
              HeatControl(DISABLE);
              FanControl(0);  //关�?�机
              ConfigParam.WorkingStatus.working_status = ENUM_WORKING_WAIT;
              working_step=STEP3;
            }
            if(working_step==STEP4)
            { //表示驱蚊开�?的时�?
              switch (ConfigParam.RepelSetting.repel_sett_area)
              { //根据当前的面�?来�?�算具体的驱蚊开关时�?(这里表示关闭的时�?)  这里的智能�?�测没有做
              case ENUM_21_30_M2:
                  second_cnt=ConfigParam.FactorySetting.area30m2_factory*ConfigParam.FactorySetting.air_condi_open_time*60UL/100;
                break;
              case ENUM_10_20_M2:
                  second_cnt=ConfigParam.FactorySetting.area20m2_factory*ConfigParam.FactorySetting.air_condi_open_time*60UL/100;
                break;
              case ENUM_BENEATH_10M2:
                  second_cnt=ConfigParam.FactorySetting.area10m2_factory*ConfigParam.FactorySetting.air_condi_open_time*60UL/100;
                break; 
             case ENUM_AUTO_:
                  second_cnt=ConfigParam.FactorySetting.area10m2_factory*ConfigParam.FactorySetting.air_condi_open_time*60UL/100;
                break;   //ENUM_AUTO_
              default:
                break;
              }
              HeatControl(ENABLE); //开加热
              FanControl(1);  //开风机
              ConfigParam.WorkingStatus.working_status = ENUM_WORKING_WAIT;
              working_step=STEP1;
            }
        }
      } 
      else if(mark==0)
      {
        if(mark1==1 || stop_refresh==1)
        {
          mark1=0;
          stop_refresh=0;
          ConfigParam.WorkingStatus.working_status = ENUM_WORKING_STOP;
          IsChangeMenu=true;  //重绘界面
        }
        second_cnt=0;       //计时时间归零
        working_step=STEP_ALL; //状态�?�位
        HeatControl(DISABLE);
        FanControl(0);  //关�?�机
      }
    }
  }
}


/**                                      
  * @brief  主�?�是针�?�母�? 驱蚊模式      
  * @param  �?
  * @retval �?
  */
void RepelMaternal(void)
{
  if(ConfigParam.WorkingMode.working_mode == ENUM_REPEL_MATERNAL_MODE) //驱蚊
  { //针�?�驱蚊母�?
    // ENUM_MOS_REPEL_NORMAL,
    // ENUM_MOS_REPEL_TIMING,
    if(ConfigParam.RepelSetting.repel_sett_mode==ENUM_MOS_REPEL_NORMAL)
    {   //此时如果点了开�?,就得开始工�?
        if(ConfigParam.WorkingStatus.working_status == ENUM_WORKING_READY)    //一切从简,能用就�??
        { //这里�?点下�?动键之后的情�?    驱蚊时也得延�?,不过这里的延时是得开�?加热�?
          HeatControl(ENABLE);  //开�?蚊�?�加�?(预加�?)
          FanControl(1);  //蚊�?�加�?�?,风机也得开   脱�?�然后�?�向远方
          second_cnt=ConfigParam.FactorySetting.InitRepelTime*60;
          working_step=STEP1;
          ConfigParam.WorkingStatus.working_status = ENUM_WORKING_WAIT;
        }
        else if (ConfigParam.WorkingStatus.working_status == ENUM_WORKING_WAIT)
        { //这里�?等待状�?
          if(second_cnt>0)
          {
            second_cnt--;
          }
          if(working_step==STEP1)
          { //在这里等待加�?完成(这�?�时间里驱蚊�?开�?�?)
            if(second_cnt==0)
            { //前面的加�?时间�?,下面开�?�?�?加热
              ConfigParam.WorkingStatus.working_status = ENUM_WORKING_START;
              working_step=STEP2; //
            }
            if(ConfigParam.RepelSetting.total_repel_time>0)
            { //如果还有驱蚊药剂的话
              ConfigParam.RepelSetting.total_repel_time--;   //每隔1s药剂总时间,得减1
              if(ConfigParam.RepelSetting.total_repel_time%1800==0)
              { //每个30min对药剂时间进行存储
                ee_WriteBytes((uint8_t *)&ConfigParam.RepelSetting.repel_sett_mode,ConfigParam.RepelSetting.repel_sett_addr,REPELLENT_SETT_LENGTH);
              }
            }
            else 
            {  //这里是驱蚊药水用完了的情况
              ConfigParam.WorkingStatus.working_status=ENUM_WORKING_STOP;
              IsChangeMenu=true;  //重绘界面
            }
          }
          if(working_step==STEP3)
          { //在这里等待驱蚊开�?(这�?�时间里驱蚊�?关闭�?)
            if(second_cnt==0)
            { //再�?�开�?驱蚊
              ConfigParam.WorkingStatus.working_status = ENUM_WORKING_START;
              working_step=STEP4; 
            }
          }
        }
        else if (ConfigParam.WorkingStatus.working_status == ENUM_WORKING_START)
        {   //进入到这一�?,表示�?�?加热
          if(working_step==STEP2)
          { //关闭蚊�?�加�?！！
            switch (ConfigParam.RepelSetting.repel_sett_area)
            { //根据当前的面�?来�?�算具体的驱蚊开关时�?(这里表示关闭的时�?)  这里的智能�?�测没有做
            case ENUM_21_30_M2:
                second_cnt=ConfigParam.FactorySetting.area30m2_factory*ConfigParam.FactorySetting.maternal_close_time*60UL/100;
              break;
            case ENUM_10_20_M2:
                second_cnt=ConfigParam.FactorySetting.area20m2_factory*ConfigParam.FactorySetting.maternal_close_time*60UL/100;
              break;
            case ENUM_BENEATH_10M2:
                second_cnt=ConfigParam.FactorySetting.area10m2_factory*ConfigParam.FactorySetting.maternal_close_time*60UL/100;
              break; 
             case ENUM_AUTO_:
                  second_cnt=ConfigParam.FactorySetting.area10m2_factory*ConfigParam.FactorySetting.maternal_close_time*60UL/100;
                break;   //ENUM_AUTO_
            default:
              break;
            }
            HeatControl(DISABLE);
            FanControl(0);  //关�?�机
            ConfigParam.WorkingStatus.working_status = ENUM_WORKING_WAIT;
            working_step=STEP3;
          }
          if(working_step==STEP4)
          { //表示驱蚊开�?的时�?
            switch (ConfigParam.RepelSetting.repel_sett_area)
            { //根据当前的面�?来�?�算具体的驱蚊开关时�?(这里表示开�?的时�?)  这里的智能�?�测没有做
            case ENUM_21_30_M2:
                second_cnt=ConfigParam.FactorySetting.area30m2_factory*ConfigParam.FactorySetting.maternal_open_time*60UL/100;
              break;
            case ENUM_10_20_M2:
                second_cnt=ConfigParam.FactorySetting.area20m2_factory*ConfigParam.FactorySetting.maternal_open_time*60UL/100;
              break;
            case ENUM_BENEATH_10M2:
                second_cnt=ConfigParam.FactorySetting.area10m2_factory*ConfigParam.FactorySetting.maternal_open_time*60UL/100;
              break; 
             case ENUM_AUTO_:
                  second_cnt=ConfigParam.FactorySetting.area10m2_factory*ConfigParam.FactorySetting.maternal_open_time*60UL/100;
                break;   //ENUM_AUTO_
            default:
              break;
            }
            HeatControl(ENABLE); //开加热
            FanControl(1);  //开风机
            ConfigParam.WorkingStatus.working_status = ENUM_WORKING_WAIT;
            working_step=STEP1;
          }
        }
        else if (ConfigParam.WorkingStatus.working_status == ENUM_WORKING_STOP)
        {
          //IsChangeMenu=true;  //重绘界面   这里不能重绘
          second_cnt=0;       //计时时间归零
          working_step=STEP_ALL; //状态�?�位
          HeatControl(DISABLE);
          FanControl(0);  //关�?�机
        }
    }
    else if(ConfigParam.RepelSetting.repel_sett_mode==ENUM_MOS_REPEL_TIMING)
    {   //这里�?针�?�定时驱蚊的情况  在这种情况下�?有时间到了才开始驱�?
      rtc_parameter_struct RTCDateTime;  //这里还得读取当前时间
      uint16_t current_minutes=0;   //当前分钟
      uint16_t start_minutes=0;     //开始分�?
      uint16_t end_minutes=0;       //结束分钟
      static uint8_t mark1=0;

      rtc_current_time_get(&RTCDateTime);  //主�?�是获取当天的日�?
      current_minutes=BCD_To_BIN(RTCDateTime.rtc_hour)*(uint16_t)60+BCD_To_BIN(RTCDateTime.rtc_minute);
      start_minutes=ConfigParam.RepelSetting.repel_sett_timing.Start_Hour*(uint16_t)60;
      end_minutes=ConfigParam.RepelSetting.repel_sett_timing.End_Hour*(uint16_t)60;

      if(ConfigParam.RepelSetting.repel_sett_timing.End_Hour>ConfigParam.RepelSetting.repel_sett_timing.Start_Hour)
      {   //结束时间必须大于开始时�?
        if(start_minutes<= current_minutes  && current_minutes<end_minutes)
        { //到点�?
          if(timing_repel_pause==1)   //
          { //�?暂停
            if(ConfigParam.RepelSetting.repel_sett_timing.IsRepeat==true)
            { //点了每天,到点就开�?       //有些参数变化,完成后得妥善保存
              mark=1;
            }
            else if(repel_once_mark==1)
            { //没有点每�?
              repel_once_mark=0;
              mark=1;
            }
          }
        }
        else
        { //否则停机
          mark=0;
        }
      }
      else if(ConfigParam.RepelSetting.repel_sett_timing.End_Hour<ConfigParam.RepelSetting.repel_sett_timing.Start_Hour)
      { //结束时间小于开始时间的情况   ,这种情况是指,隔天的情况
        if( !(start_minutes >current_minutes  && current_minutes >=end_minutes) )  
        { //这里是从反方向来考虑的
          if(timing_repel_pause==1)   //       按下了启动键 
          { 
            if(ConfigParam.RepelSetting.repel_sett_timing.IsRepeat==true)
            { //点了每天,到点就开�?
              mark=1;
            }
            else if(repel_once_mark==1)
            { //没有点每�?
              repel_once_mark=0;
              mark=1;
            }
          }
        }
        else
        { //否则停机
          mark=0;
        }
      }
      else
      {
        //否则停机
        mark=0;
      }
      /**
       * 上面�?监控函数
       */
      if(mark==1)
      {
        if(mark1==0)    //一切从简,能用就�??
        { //这里�?点下�?动键之后的情�?    驱蚊时也得延�?,不过这里的延时是得开�?加热�?
          mark1=1;    //为关机做准�??
          ConfigParam.WorkingStatus.working_status = ENUM_WORKING_READY;
          IsChangeMenu=true;     //这里得刷新一下显�?
        }  
        else if(ConfigParam.WorkingStatus.working_status == ENUM_WORKING_READY)
        {
          HeatControl(ENABLE);  //开�?蚊�?�加�?(预加�?)
          FanControl(1);  //蚊�?�加�?�?,风机也得开   脱�?�然后�?�向远方
          second_cnt=ConfigParam.FactorySetting.InitRepelTime*60;
          working_step=STEP1;
          ConfigParam.WorkingStatus.working_status = ENUM_WORKING_WAIT;
        }
        else if (ConfigParam.WorkingStatus.working_status == ENUM_WORKING_WAIT)
        { //这里�?等待状�?
            if(second_cnt>0)
            {
              second_cnt--;
            }
            if(working_step==STEP1)
            { //在这里等待加�?完成(这�?�时间里驱蚊�?开�?�?)
              if(second_cnt==0)
              { //前面的加�?时间�?,下面开�?�?�?加热
                ConfigParam.WorkingStatus.working_status = ENUM_WORKING_START;
                working_step=STEP2; //
              }
              if(ConfigParam.RepelSetting.total_repel_time>0)
              { //如果还有驱蚊药剂的话
                ConfigParam.RepelSetting.total_repel_time--;   //每隔1s药剂总时间,得减1
                if(ConfigParam.RepelSetting.total_repel_time%1800==0)
                { //每个30min对药剂时间进行存储
                  ee_WriteBytes((uint8_t *)&ConfigParam.RepelSetting.repel_sett_mode,ConfigParam.RepelSetting.repel_sett_addr,REPELLENT_SETT_LENGTH);
                }
              }
              else
              { //这里是驱蚊药水已经用完了的情况
                timing_repel_pause=0;  //定时驱蚊暂停   
                mark=0;     //按下停止键时不管三七二十一直接停止
                stop_refresh=1;
              }
            }
            if(working_step==STEP3)
            { //在这里等待驱蚊开�?(这�?�时间里驱蚊�?关闭�?)
              if(second_cnt==0)
              { //再�?�开�?驱蚊
                ConfigParam.WorkingStatus.working_status = ENUM_WORKING_START;
                working_step=STEP4; 
              }
            }
        }
        else if (ConfigParam.WorkingStatus.working_status == ENUM_WORKING_START)
        {   //进入到这一�?,表示�?�?加热
            if(working_step==STEP2)
            { //关闭蚊�?�加�?！！
              switch (ConfigParam.RepelSetting.repel_sett_area)
              { //根据当前的面�?来�?�算具体的驱蚊开关时�?(这里表示关闭的时�?)  这里的智能�?�测没有做
              case ENUM_21_30_M2:
                  second_cnt=ConfigParam.FactorySetting.area30m2_factory*ConfigParam.FactorySetting.maternal_close_time*60UL/100;
                break;
              case ENUM_10_20_M2:
                  second_cnt=ConfigParam.FactorySetting.area20m2_factory*ConfigParam.FactorySetting.maternal_close_time*60UL/100;
                break;
              case ENUM_BENEATH_10M2:
                  second_cnt=ConfigParam.FactorySetting.area10m2_factory*ConfigParam.FactorySetting.maternal_close_time*60UL/100;
                break; 
             case ENUM_AUTO_:
                  second_cnt=ConfigParam.FactorySetting.area10m2_factory*ConfigParam.FactorySetting.maternal_close_time*60UL/100;
                break;   //ENUM_AUTO_
              default:
                break;
              }
              HeatControl(DISABLE);
              FanControl(0);  //关�?�机
              ConfigParam.WorkingStatus.working_status = ENUM_WORKING_WAIT;
              working_step=STEP3;
            }
            if(working_step==STEP4)
            { //表示驱蚊开�?的时�?
              switch (ConfigParam.RepelSetting.repel_sett_area)
              { //根据当前的面�?来�?�算具体的驱蚊开关时�?(这里表示关闭的时�?)  这里的智能�?�测没有做
              case ENUM_21_30_M2:
                  second_cnt=ConfigParam.FactorySetting.area30m2_factory*ConfigParam.FactorySetting.maternal_open_time*60UL/100;
                break;
              case ENUM_10_20_M2:
                  second_cnt=ConfigParam.FactorySetting.area20m2_factory*ConfigParam.FactorySetting.maternal_open_time*60UL/100;
                break;
              case ENUM_BENEATH_10M2:
                  second_cnt=ConfigParam.FactorySetting.area10m2_factory*ConfigParam.FactorySetting.maternal_open_time*60UL/100;
                break; 
             case ENUM_AUTO_:
                  second_cnt=ConfigParam.FactorySetting.area10m2_factory*ConfigParam.FactorySetting.maternal_open_time*60UL/100;
                break;   //ENUM_AUTO_
              default:
                break;
              }
              HeatControl(ENABLE); //开加热
              FanControl(1);  //开风机
              ConfigParam.WorkingStatus.working_status = ENUM_WORKING_WAIT;
              working_step=STEP1;
            }
        }
      } 
      else if(mark==0)
      {
        if(mark1==1 || stop_refresh==1)
        {
          mark1=0;
          stop_refresh=0;
          ConfigParam.WorkingStatus.working_status = ENUM_WORKING_STOP;
          IsChangeMenu=true;  //重绘界面
        }
        second_cnt=0;       //计时时间归零
        working_step=STEP_ALL; //状态�?�位
        HeatControl(DISABLE);
        FanControl(0);  //关�?�机
      }
    }
  }
}



/**                                      
  * @brief  主�?�是针�?��?�常 驱蚊模式      
  * @param  �?
  * @retval �?
  */
void RepelNormal(void)
{
  if(ConfigParam.WorkingMode.working_mode == ENUM_REPEL_NORMAL_MODE) //驱蚊
  { //针�?��?�常母婴
    // ENUM_MOS_REPEL_NORMAL,
    // ENUM_MOS_REPEL_TIMING,
    if(ConfigParam.RepelSetting.repel_sett_mode==ENUM_MOS_REPEL_NORMAL)
    {   //此时如果点了开�?,就得开始工�?
        if(ConfigParam.WorkingStatus.working_status == ENUM_WORKING_READY)    //一切从简,能用就�??
        { //这里�?点下�?动键之后的情�?    驱蚊时也得延�?,不过这里的延时是得开�?加热�?
          HeatControl(ENABLE);  //开�?蚊�?�加�?(预加�?)
          FanControl(1);  //蚊�?�加�?�?,风机也得开   脱�?�然后�?�向远方
          second_cnt=ConfigParam.FactorySetting.InitRepelTime*60;
          working_step=STEP1;
          ConfigParam.WorkingStatus.working_status = ENUM_WORKING_WAIT;
        }
        else if (ConfigParam.WorkingStatus.working_status == ENUM_WORKING_WAIT)
        { //这里�?等待状�?
          if(second_cnt>0)
          {
            second_cnt--;
          }
          if(working_step==STEP1)
          { //在这里等待加�?完成(这�?�时间里驱蚊�?开�?�?)
            if(second_cnt==0)
            { //前面的加�?时间�?,下面开�?�?�?加热
              ConfigParam.WorkingStatus.working_status = ENUM_WORKING_START;
              working_step=STEP2; //
            }
              if(ConfigParam.RepelSetting.total_repel_time>0)
              { //如果还有驱蚊药剂的话
                ConfigParam.RepelSetting.total_repel_time--;   //每隔1s药剂总时间,得减1
                if(ConfigParam.RepelSetting.total_repel_time%1800==0)
                { //每个30min对药剂时间进行存储
                  ee_WriteBytes((uint8_t *)&ConfigParam.RepelSetting.repel_sett_mode,ConfigParam.RepelSetting.repel_sett_addr,REPELLENT_SETT_LENGTH);
                }
              }
              else 
              {  //这里是驱蚊药水用完了的情况
                ConfigParam.WorkingStatus.working_status=ENUM_WORKING_STOP;
                IsChangeMenu=true;  //重绘界面
              }
          }
          if(working_step==STEP3)
          { //在这里等待驱蚊开�?(这�?�时间里驱蚊�?关闭�?)
            if(second_cnt==0)
            { //再�?�开�?驱蚊
              ConfigParam.WorkingStatus.working_status = ENUM_WORKING_START;
              working_step=STEP4; 
            }
          }
        }
        else if (ConfigParam.WorkingStatus.working_status == ENUM_WORKING_START)
        {   //进入到这一�?,表示�?�?加热
          if(working_step==STEP2)
          { //关闭蚊�?�加�?！！
            switch (ConfigParam.RepelSetting.repel_sett_area)
            { //根据当前的面�?来�?�算具体的驱蚊开关时�?(这里表示关闭的时�?)  这里的智能�?�测没有做
            case ENUM_21_30_M2:
                second_cnt=ConfigParam.FactorySetting.area30m2_factory*ConfigParam.FactorySetting.normal_close_time*60UL/100;
              break;
            case ENUM_10_20_M2:
                second_cnt=ConfigParam.FactorySetting.area20m2_factory*ConfigParam.FactorySetting.normal_close_time*60UL/100;
              break;
            case ENUM_BENEATH_10M2:
                second_cnt=ConfigParam.FactorySetting.area10m2_factory*ConfigParam.FactorySetting.normal_close_time*60UL/100;
              break; 
             case ENUM_AUTO_:
                  second_cnt=ConfigParam.FactorySetting.area10m2_factory*ConfigParam.FactorySetting.normal_close_time*60UL/100;
                break;   //ENUM_AUTO_
            default:
              break;
            }
            HeatControl(DISABLE);
            FanControl(0);  //关�?�机
            ConfigParam.WorkingStatus.working_status = ENUM_WORKING_WAIT;
            working_step=STEP3;
          }
          if(working_step==STEP4)
          { //表示驱蚊开�?的时�?
            switch (ConfigParam.RepelSetting.repel_sett_area)
            { //根据当前的面�?来�?�算具体的驱蚊开关时�?(这里表示开�?的时�?)  这里的智能�?�测没有做
            case ENUM_21_30_M2:
                second_cnt=ConfigParam.FactorySetting.area30m2_factory*ConfigParam.FactorySetting.normal_open_time*60UL/100;
              break;
            case ENUM_10_20_M2:
                second_cnt=ConfigParam.FactorySetting.area20m2_factory*ConfigParam.FactorySetting.normal_open_time*60UL/100;
              break;
            case ENUM_BENEATH_10M2:
                second_cnt=ConfigParam.FactorySetting.area10m2_factory*ConfigParam.FactorySetting.normal_open_time*60UL/100;
              break; 
             case ENUM_AUTO_:
                  second_cnt=ConfigParam.FactorySetting.area10m2_factory*ConfigParam.FactorySetting.normal_open_time*60UL/100;
                break;   //ENUM_AUTO_
            default:
              break;
            }
            HeatControl(ENABLE); //开加热
            FanControl(1);  //开风机
            ConfigParam.WorkingStatus.working_status = ENUM_WORKING_WAIT;
            working_step=STEP1;
          }
        }
        else if (ConfigParam.WorkingStatus.working_status == ENUM_WORKING_STOP)
        {
          //IsChangeMenu=true;  //重绘界面   这里不能重绘
          second_cnt=0;       //计时时间归零
          working_step=STEP_ALL; //状态�?�位
          HeatControl(DISABLE);
          FanControl(0);  //关�?�机
        }
    }
    else if(ConfigParam.RepelSetting.repel_sett_mode==ENUM_MOS_REPEL_TIMING)
    {   //这里�?针�?�定时驱蚊的情况  在这种情况下�?有时间到了才开始驱�?
      rtc_parameter_struct RTCDateTime;  //这里还得读取当前时间
      uint16_t current_minutes=0;   //当前分钟
      uint16_t start_minutes=0;     //开始分�?
      uint16_t end_minutes=0;       //结束分钟
      static uint8_t mark1=0;       //�?做一次启�?(探测变化)

      rtc_current_time_get(&RTCDateTime);  //主�?�是获取当天的日�?
      current_minutes=BCD_To_BIN(RTCDateTime.rtc_hour)*(uint16_t)60+BCD_To_BIN(RTCDateTime.rtc_minute);
      start_minutes=ConfigParam.RepelSetting.repel_sett_timing.Start_Hour*(uint16_t)60;
      end_minutes=ConfigParam.RepelSetting.repel_sett_timing.End_Hour*(uint16_t)60;

      if(ConfigParam.RepelSetting.repel_sett_timing.End_Hour>ConfigParam.RepelSetting.repel_sett_timing.Start_Hour)
      {   //结束时间必须大于开始时�?
        if(start_minutes<= current_minutes  && current_minutes<end_minutes)
        { //到点�?
          if(timing_repel_pause==1)   //点了开始键
          { //�?暂停
            if(ConfigParam.RepelSetting.repel_sett_timing.IsRepeat==true)
            { //点了每天,到点就开�?       //有些参数变化,完成后得妥善保存
              mark=1;
            }
            else if(repel_once_mark==1)
            { //没有点每�?
              repel_once_mark=0;
              mark=1;
            }
          }
        }
        else
        { //否则停机
          mark=0;
        }
      }


      else if(ConfigParam.RepelSetting.repel_sett_timing.End_Hour<ConfigParam.RepelSetting.repel_sett_timing.Start_Hour)
      { //结束时间小于开始时间的情况   ,这种情况是指,隔天的情况
        if( !(start_minutes >current_minutes  && current_minutes >=end_minutes) )  
        { //这里是从反方向来考虑的
          if(timing_repel_pause==1)   //       按下了启动键 
          { 
            if(ConfigParam.RepelSetting.repel_sett_timing.IsRepeat==true)
            { //点了每天,到点就开�?
              mark=1;
            }
            else if(repel_once_mark==1)
            { //没有点每�?
              repel_once_mark=0;
              mark=1;
            }
          }
        }
        else
        { //否则停机
          mark=0;
        }
      }
      else
      {
        //否则停机
        mark=0;
      }
      /**
       * 上面�?监控函数
       */
      if(mark==1)
      {
        if(mark1==0)    //一切从简,能用就�??
        { //这里�?点下�?动键之后的情�?    驱蚊时也得延�?,不过这里的延时是得开�?加热�?
          mark1=1;    //为关机做准�??
          ConfigParam.WorkingStatus.working_status = ENUM_WORKING_READY;
          IsChangeMenu=true;     //这里得刷新一下显�?
        }  
        else if(ConfigParam.WorkingStatus.working_status == ENUM_WORKING_READY)
        {
          HeatControl(ENABLE);  //开�?蚊�?�加�?(预加�?)
          FanControl(1);  //蚊�?�加�?�?,风机也得开   脱�?�然后�?�向远方
          second_cnt=ConfigParam.FactorySetting.InitRepelTime*60;
          working_step=STEP1;
          ConfigParam.WorkingStatus.working_status = ENUM_WORKING_WAIT;
        }
        else if (ConfigParam.WorkingStatus.working_status == ENUM_WORKING_WAIT)
        { //这里�?等待状�?
            if(second_cnt>0)
            {
              second_cnt--;
            }
            if(working_step==STEP1)
            { //在这里等待加�?完成(这�?�时间里驱蚊�?开�?�?)
              if(second_cnt==0)
              { //前面的加�?时间�?,下面开�?�?�?加热
                ConfigParam.WorkingStatus.working_status = ENUM_WORKING_START;
                working_step=STEP2; //
              }
              if(ConfigParam.RepelSetting.total_repel_time>0)
              { //如果还有驱蚊药剂的话
                ConfigParam.RepelSetting.total_repel_time--;   //每隔1s药剂总时间,得减1
                if(ConfigParam.RepelSetting.total_repel_time%1800==0)
                { //每个30min对药剂时间进行存储
                  ee_WriteBytes((uint8_t *)&ConfigParam.RepelSetting.repel_sett_mode,ConfigParam.RepelSetting.repel_sett_addr,REPELLENT_SETT_LENGTH);
                }
              }
              else
              { //这里是驱蚊药水已经用完了的情况
                timing_repel_pause=0;  //定时驱蚊暂停   
                mark=0;     //按下停止键时不管三七二十一直接停止
                stop_refresh=1;
              }
            }
            if(working_step==STEP3)
            { //在这里等待驱蚊开�?(这�?�时间里驱蚊�?关闭�?)
              if(second_cnt==0)
              { //再�?�开�?驱蚊
                ConfigParam.WorkingStatus.working_status = ENUM_WORKING_START;
                working_step=STEP4; 
              }
            }
        }
        else if (ConfigParam.WorkingStatus.working_status == ENUM_WORKING_START)
        {   //进入到这一�?,表示�?�?加热
            if(working_step==STEP2)
            { //关闭蚊�?�加�?！！
              switch (ConfigParam.RepelSetting.repel_sett_area)
              { //根据当前的面�?来�?�算具体的驱蚊开关时�?(这里表示关闭的时�?)  这里的智能�?�测没有做
              case ENUM_21_30_M2:
                  second_cnt=ConfigParam.FactorySetting.area30m2_factory*ConfigParam.FactorySetting.normal_close_time*60UL/100;
                break;
              case ENUM_10_20_M2:
                  second_cnt=ConfigParam.FactorySetting.area20m2_factory*ConfigParam.FactorySetting.normal_close_time*60UL/100;
                break;
              case ENUM_BENEATH_10M2:
                  second_cnt=ConfigParam.FactorySetting.area10m2_factory*ConfigParam.FactorySetting.normal_close_time*60UL/100;
                break; 
             case ENUM_AUTO_:
                  second_cnt=ConfigParam.FactorySetting.area10m2_factory*ConfigParam.FactorySetting.normal_close_time*60UL/100;
                break;   //ENUM_AUTO_
              default:
                break;
              }
              HeatControl(DISABLE);
              FanControl(0);  //关�?�机
              ConfigParam.WorkingStatus.working_status = ENUM_WORKING_WAIT;
              working_step=STEP3;
            }
            if(working_step==STEP4)
            { //表示驱蚊开�?的时�?
              switch (ConfigParam.RepelSetting.repel_sett_area)
              { //根据当前的面�?来�?�算具体的驱蚊开关时�?(这里表示关闭的时�?)  这里的智能�?�测没有做
              case ENUM_21_30_M2:
                  second_cnt=ConfigParam.FactorySetting.area30m2_factory*ConfigParam.FactorySetting.normal_open_time*60UL/100;
                break;
              case ENUM_10_20_M2:
                  second_cnt=ConfigParam.FactorySetting.area20m2_factory*ConfigParam.FactorySetting.normal_open_time*60UL/100;
                break;
              case ENUM_BENEATH_10M2:
                  second_cnt=ConfigParam.FactorySetting.area10m2_factory*ConfigParam.FactorySetting.normal_open_time*60UL/100;
                break; 
             case ENUM_AUTO_:
                  second_cnt=ConfigParam.FactorySetting.area10m2_factory*ConfigParam.FactorySetting.normal_open_time*60UL/100;
                break;   //ENUM_AUTO_
              default:
                break;
              }
              HeatControl(ENABLE); //开加热
              FanControl(1);  //开风机
              ConfigParam.WorkingStatus.working_status = ENUM_WORKING_WAIT;
              working_step=STEP1;
            }
        }
      } 
      else if(mark==0)
      {
        if(mark1==1 || stop_refresh==1)
        {
          mark1=0;
          stop_refresh=0;
          ConfigParam.WorkingStatus.working_status = ENUM_WORKING_STOP;
          IsChangeMenu=true;  //重绘界面
        }
        second_cnt=0;       //计时时间归零
        working_step=STEP_ALL; //状态�?�位
        HeatControl(DISABLE);
        FanControl(0);  //关�?�机
      }
    }
  }
}


/**                                      
  * @brief  主�?�是针�?��?�强 驱蚊模式      
  * @param  �?
  * @retval �?
  */
void RepelEnchance(void)
{
  if(ConfigParam.WorkingMode.working_mode == ENUM_REPEL_ENCHANCE_MODE) //驱蚊
  { //针�?�驱蚊�?�强,就是一上电就开�?
    // ENUM_MOS_REPEL_NORMAL,
    // ENUM_MOS_REPEL_TIMING,
    if(ConfigParam.RepelSetting.repel_sett_mode==ENUM_MOS_REPEL_NORMAL)
    {   //此时如果点了开�?,就得开始工�?
        if(ConfigParam.WorkingStatus.working_status == ENUM_WORKING_READY)    //一切从简,能用就�??
        { //这里�?点下�?动键之后的情�?    驱蚊时也得延�?,不过这里的延时是得开�?加热�?
          HeatControl(ENABLE);  //开�?蚊�?�加�?(预加�?)
          FanControl(1);  //蚊�?�加�?�?,风机也得开   脱�?�然后�?�向远方
            if(ConfigParam.RepelSetting.total_repel_time>0)
            { //如果还有驱蚊药剂的话
              ConfigParam.RepelSetting.total_repel_time--;   //每隔1s药剂总时间,得减1
              if(ConfigParam.RepelSetting.total_repel_time%1800==0)
              { //每个30min对药剂时间进行存储
                ee_WriteBytes((uint8_t *)&ConfigParam.RepelSetting.repel_sett_mode,ConfigParam.RepelSetting.repel_sett_addr,REPELLENT_SETT_LENGTH);
              }
            }
              else 
              {  //这里是驱蚊药水用完了的情况
                ConfigParam.WorkingStatus.working_status=ENUM_WORKING_STOP;
                IsChangeMenu=true;  //重绘界面
              }
        }
        else if (ConfigParam.WorkingStatus.working_status == ENUM_WORKING_STOP)
        {
          //IsChangeMenu=true;  //重绘界面   这里不能重绘
          second_cnt=0;       //计时时间归零
          working_step=STEP_ALL; //状态�?�位
          HeatControl(DISABLE);
          FanControl(0);  //关�?�机
        }
    }
    else if(ConfigParam.RepelSetting.repel_sett_mode==ENUM_MOS_REPEL_TIMING)
    {   //这里�?针�?�定时驱蚊的情况  在这种情况下�?有时间到了才开始驱�?
      rtc_parameter_struct RTCDateTime;  //这里还得读取当前时间
      uint16_t current_minutes=0;   //当前分钟
      uint16_t start_minutes=0;     //开始分�?
      uint16_t end_minutes=0;       //结束分钟
      static uint8_t mark1=0;

      rtc_current_time_get(&RTCDateTime);  //主�?�是获取当天的日�?
      current_minutes=BCD_To_BIN(RTCDateTime.rtc_hour)*(uint16_t)60+BCD_To_BIN(RTCDateTime.rtc_minute);
      start_minutes=ConfigParam.RepelSetting.repel_sett_timing.Start_Hour*(uint16_t)60;
      end_minutes=ConfigParam.RepelSetting.repel_sett_timing.End_Hour*(uint16_t)60;

      if(ConfigParam.RepelSetting.repel_sett_timing.End_Hour>ConfigParam.RepelSetting.repel_sett_timing.Start_Hour)
      {   //结束时间必须大于开始时�?
        if(start_minutes<= current_minutes  && current_minutes<end_minutes)
        { //到点�?
          if(timing_repel_pause==1)   //
          { //�?暂停
            if(ConfigParam.RepelSetting.repel_sett_timing.IsRepeat==true)
            { //点了每天,到点就开�?       //有些参数变化,完成后得妥善保存
              mark=1;
            }
            else if(repel_once_mark==1)
            { //没有点每�?
              repel_once_mark=0;
              mark=1;
            }
          }
        }
        else
        { //否则停机
          mark=0;
        }
      }

      else if(ConfigParam.RepelSetting.repel_sett_timing.End_Hour<ConfigParam.RepelSetting.repel_sett_timing.Start_Hour)
      { //结束时间小于开始时间的情况   ,这种情况是指,隔天的情况
        if( !(start_minutes >current_minutes  && current_minutes >=end_minutes) )  
        { //这里是从反方向来考虑的
          if(timing_repel_pause==1)   //       按下了启动键 
          { 
            if(ConfigParam.RepelSetting.repel_sett_timing.IsRepeat==true)
            { //点了每天,到点就开�?
              mark=1;
            }
            else if(repel_once_mark==1)
            { //没有点每�?
              repel_once_mark=0;
              mark=1;
            }
          }
        }
        else
        { //否则停机
          mark=0;
        }
      }
      else
      {
        //否则停机
        mark=0;
      }
      /**
       * 上面�?监控函数
       */
      if(mark==1)
      {
        if(mark1==0)    //一切从简,能用就�??
        { //这里�?点下�?动键之后的情�?    驱蚊时也得延�?,不过这里的延时是得开�?加热�?
          mark1=1;    //为关机做准�??
          HeatControl(ENABLE);  //开�?蚊�?�加�?(预加�?)
          FanControl(1);  //蚊�?�加�?�?,风机也得开   脱�?�然后�?�向远方
          ConfigParam.WorkingStatus.working_status = ENUM_WORKING_READY;
          IsChangeMenu=true;     //这里得刷新一下显�?
        } 
        if(ConfigParam.RepelSetting.total_repel_time>0)
        { //如果还有驱蚊药剂的话
          ConfigParam.RepelSetting.total_repel_time--;   //每隔1s药剂总时间,得减1
          if(ConfigParam.RepelSetting.total_repel_time%1800==0)
          { //每个30min对药剂时间进行存储
            ee_WriteBytes((uint8_t *)&ConfigParam.RepelSetting.repel_sett_mode,ConfigParam.RepelSetting.repel_sett_addr,REPELLENT_SETT_LENGTH);
          }
        }
        else
        { //这里是驱蚊药水已经用完了的情况
          timing_repel_pause=0;  //定时驱蚊暂停   
          mark=0;     //按下停止键时不管三七二十一直接停止
          stop_refresh=1;
        }
      }
      else if(mark==0)
      {
        if(mark1==1 || stop_refresh==1)
        {
          mark1=0;
          stop_refresh=0;
          ConfigParam.WorkingStatus.working_status = ENUM_WORKING_STOP;
          IsChangeMenu=true;  //重绘界面
        }
        second_cnt=0;       //计时时间归零
        working_step=STEP_ALL; //状态�?�位
        HeatControl(DISABLE);
        FanControl(0);  //关�?�机
      }
    }
  }
}

/**                                      
  * @brief  主�?�控制函�?(要在Control线程�?调用)       
  * @param  �?    越是困难才越有意义！(轻轻松松就成功了,那�?�没意思呀�?)
  * @retval �?
  */
void ControlAction(void)
{ //�?以考虑状态机的工作方�?  就绪-->等待-->工作-->停�??
  rt_base_t level;

  level = rt_hw_interrupt_disable();
  switch (ConfigParam.WorkingMode.working_mode)
  {
    case ENUM_FUMIGATE_NORMAL_MODE:
      FumigateNormal();
      break;
    case ENUM_FUMIGATE_ENCHANCE_MODE:
      FumigateEnchance();
      break;
    case ENUM_REPEL_AIR_CONDI_MODE:
      RepelAirCondition();
      break;
    case ENUM_REPEL_MATERNAL_MODE:
      RepelMaternal();
      break;
    case ENUM_REPEL_ENCHANCE_MODE:
      RepelEnchance();
      break;   
    case ENUM_REPEL_NORMAL_MODE:
      RepelNormal();
      break;   
    default:
      break;
  }
  rt_hw_interrupt_enable(level);
}